使用 .NET Framework 將資訊寫入 Windows 事件記錄檔
簡介
在 .NET Framework 中,我們可以使用 System.Diagnostics.EventLog 這個類別來處理與 Windows 事件記錄檔相關的操作。EventLog 有兩個主要參數,分別是 Source 和 LogName。
- Source(來源):通常用來標示應用程式名稱。如果你要寫入事件記錄檔,建議先檢查該來源是否已存在,如果不存在,可以使用
EventLog.CreateEventSource(source, logName)方法來建立新的來源。

- LogName(記錄檔名稱):指定要寫入來源專案的記錄檔名稱。同一個 Source 只能與一個 LogName 建立關聯。

程式碼範例
以下是一個簡單的程式碼範例,用於將訊息寫入事件記錄檔:
csharp
string source = "MySource";
// 檢核 Source 是否存在,不存在就建立 Source
if (!EventLog.SourceExists(source)) {
// LogName 可以寫 Application 或 應用程式 都會關聯到應用程式那邊
EventLog.CreateEventSource(source, "Application");
}
// 寫入訊息
EventLog.WriteEntry(source, "MyMessage");
// 也可以這樣寫
using (EventLog log = new EventLog()) {
log.Source = source;
log.WriteEntry("MyMessage");
}執行結果:

TIP
WriteEntry() 方法還有其他可選用的參數,例如 EventLogEntryType 和 EventID,可用於對應事件檢視器中的「等級」和「事件識別碼」等屬性。有關這些參數的對應關係,可以在查閱相關資料時得知,此處不做特別說明。
也可以自訂記錄檔名稱,如下面程式碼所示,將 LogName 定義為 MyLogName。
csharp
// MySource 已經使用過,所以這邊改 MySource2
string source = "MySource2";
if (!EventLog.SourceExists(source)) {
EventLog.CreateEventSource(source, "MyLogName");
}
EventLog.WriteEntry(source, "MyMessage");執行結果:

WARNING
要重開事件檢視器才可以看到新的記錄檔。
如果想要更改 Source 所綁定的 LogName,可以先使用 Source,然後再重新建立新的關聯。
csharp
string source = "MySource";
string logName = "MyLogName";
if (EventLog.SourceExists(source)) {
string oldLogName = EventLog.LogNameFromSourceName(source, ".");
if (oldLogName != logName) {
EventLog.DeleteEventSource(source);
EventLog.CreateEventSource(source, logName);
}
} else {
EventLog.CreateEventSource(source, logName);
}
EventLog.WriteEntry(source, "MyMessage");WARNING
以上程式碼是從 MSDN 上修改來的,你可能以為可以順利的重新關聯 Source 與記錄檔,但實際上會發現寫入的訊息還是寫到舊的記錄檔裡面,仔細看文件會發現還有以下備註說明:
如果來源已經對應到記錄檔,而且您重新將它對應到新的記錄檔,您必須重新開機電腦,變更才會生效。
如果要刪除記錄檔,可以使用 EventLog.Delete(logName) 刪除指定的記錄檔。
參考資料
異動歷程
- 2023-08-04 初版文件建立。
